package com.example.myapplication.uitls

import android.os.RemoteException
import android.util.Base64
import android.util.Log
import com.example.myapplication.`interface`.PrintDriver
import com.example.myapplication.bean.*
import com.gprinter.aidl.GpService
import com.gprinter.command.EscCommand
import com.gprinter.command.GpCom
import com.gprinter.command.GpUtils
import com.gprinter.command.LabelCommand
import java.util.*

class JB380ADriver(var gpService: GpService) : PrintDriver {
    lateinit var tsc: LabelCommand

    override fun Open() {
//        val rel = gpService.openPort(
//            0,
//            mPortParam.getPortType(),
//            mPortParam.getBluetoothAddr(),
//            0
//        )
//        CoroutineScope(Dispatchers.Main).launch {
//            withContext(Dispatchers.Default) { // 耗时操作在IO中执行
//                // delay是一个非阻塞式的函数，让协程挂起，不影响其它协程运行
//                // 让协程挂起5秒
//                delay(5000) // 假设有5s的耗时操作
//            }
//
//        }.start()
    }

    override fun PrinterStatus() {
    }

    override fun Close() {
    }

    override fun Print(data: HashMap<String, String>, template: PrintTemplate) {
        Log.e("sss", data.toString())
//        Log.e("sss1", Gson().toJson(template))
        /**
         * 佳博380A打印配置
         */
        sendLabel(template.page)

        for (element in template.elements) {
            Log.e("sss2", element.toString())
            when (element) {
                is BoxElement -> renderBox(element, data)
                is LineElement -> renderLine(element, data)
                is TextElement -> renderText(element, data)
                is BarCodeElement -> renderBarCode(element, data)
            }
        }

        /**
         * 佳博380A打印
         */
        tsc.addPrint(1, 1) //1份1张 打印标签
        val datas = tsc.command // 发送数据
        val bytes = GpUtils.ByteTo_byte(datas)
        val data = Base64.encodeToString(bytes, Base64.DEFAULT)
        try {
            val rel = gpService.sendLabelCommand(0, data)
            val r = GpCom.ERROR_CODE.values()[rel]
            if (r != GpCom.ERROR_CODE.SUCCESS) {
                Log.e("jiabo", "dayinbuchengong---------------------${GpCom.getErrorText(r)}")
            }
            return
        } catch (e: RemoteException) {
            e.printStackTrace()
        }
    }

    private fun renderBox(element: BoxElement, data: HashMap<String, String>) {
        /** 佳博打印Box
         * {x0} 左上角的 X 坐标
         * {y0} 左上角的 Y 坐标
         * {x1} 右下角的 X 坐标
         * {y1} 右下角的 Y 坐标
         * {width} 形成矩形框的线条的单位宽度
         */
        tsc.addBox(
            element.x,
            element.y,
            element.x + element.width,
            element.y + element.height,
            element.borderSize
        )
    }

    private fun renderLine(element: LineElement, data: HashMap<String, String>) {
        /** 佳博打印线条
         * {x0} 左上角水平方向起点
         * {y0} 左上角垂直方向起点
         * {width} 线宽
         * {height} 线高
         */
        tsc.addBar(element.x, element.y, element.width, element.height)
    }

    private fun renderText(element: TextElement, data: HashMap<String, String>) {
        var text = data["text"]
        var font = element.printerSpec["佳博-380A"]

        if (element.hAlign == "LEFT") {

        } else if (element.hAlign == "CENTER") {
            /**
             * 40是一个文字的宽度
             */
            element.x = element.width / 2 - text!!.length * 40 / 2
        } else if (element.hAlign == "RIGHT") {

        }
        /** 佳博打印文字
         * x 文字 X 方向起始点坐标
         * y 文字 Y 方向起始点坐标
         * font SIMPLIFIED_CHINESE 字体名称
         * rotation 文字旋转角度（顺时针方向）
         * x-multiplication X 方向放大倍率 1-10
         * y-multiplication Y 方向放大倍率 1-10
         * str 要打印的文本
         */
        tsc.addText(
            element.x,
            element.y,
            LabelCommand.FONTTYPE.SIMPLIFIED_CHINESE,
            LabelCommand.ROTATION.ROTATION_0,
            if (element.mag == LabelCommand.FONTMUL.MUL_2.value) LabelCommand.FONTMUL.MUL_2 else LabelCommand.FONTMUL.MUL_1,
            if (element.mag == LabelCommand.FONTMUL.MUL_2.value) LabelCommand.FONTMUL.MUL_2 else LabelCommand.FONTMUL.MUL_1,
            text
        )
    }

    private fun renderBarCode(element: BarCodeElement, data: HashMap<String, String>) {
        var printorder = data["barcode"]
        /** 佳博打印条形码
         * x 左上角水平坐标起点，以点（dot）表示
         * y 左上角垂直坐标起点，以点（dot）表示
         * type CODE128编码类型
         * height 条形码高度，以点（dot）表示
         * LabelCommand.READABEL.EANBEL  0 表示人眼不可识，1 表示人眼可识
         * rotation 条形码旋转角度，顺时针方向
         * narrow 窄 bar 宽度，以点（dot）表示
         * width 宽 bar 宽度，以点（dot）表示
         * printorder 打印内容
         */
        tsc.add1DBarcode(
            element.x, element.y, LabelCommand.BARCODETYPE.CODE128, element.hight,
            LabelCommand.READABEL.DISABLE, LabelCommand.ROTATION.ROTATION_0, 3, 400, printorder
        )
    }

    /**
     * 佳博380A打印配置
     */
    fun sendLabel(page: PrintPageParameter) {
        tsc = LabelCommand()
        /**
         * 设置标签尺寸，按照实际尺寸设置
         */
        tsc.addSize(page.width, page.height)
        /**
         * 打印时的浓度
         */
        tsc.addDensity(LabelCommand.DENSITY.DNESITY15)
        /**
         * 设置标签间隙，按照实际尺寸设置，如果为无间隙纸则设置为0
         */
        tsc.addGap(1)
        /**
         * 设置打印速度
         */
        tsc.addSpeed(LabelCommand.SPEED.SPEED4)
        /**
         * 设置打印方向
         */
        tsc.addDirection(LabelCommand.DIRECTION.BACKWARD, LabelCommand.MIRROR.NORMAL)
        /**
         * 开启带Response的打印，用于连续打印
         */
        tsc.addQueryPrinterStatus(LabelCommand.RESPONSE_MODE.ON)
        /**
         * 设置原点坐标，用于连续打印
         */
        tsc.addReference(0, 0)
        /**
         * 撕纸模式开启
         */
        tsc.addTear(EscCommand.ENABLE.ON)
        /**
         * 清除打印缓冲区
         */
        tsc.addCls()
    }
}